package com.yx.changdao.common.utils;

import com.yx.changdao.common.enums.DateType;
import com.yx.changdao.common.exception.AlertException;
import com.yx.changdao.common.mapper.NoWorkdayMapper;
import com.yx.changdao.common.vo.count.ProblemTrend;
import com.yx.changdao.common.vo.count.ProblemTypeFather;
import com.yx.changdao.common.vo.count.input.ProblemCountType;
import com.yx.changdao.common.vo.count.leader.ProblemType;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 日期相关工具
 * @author xiapeixin
 * @date 2020-4-9
 */
public class Dates {

    /**
     * 时间格式
     */
    public static final String FORMAT_STR = "yyyy-MM-dd";

    /**
     * 时间格式详细
     */
    public static final String FORMAT_STR_DETAIL = "yyyy-MM-dd HH:mm:ss";

    /**
    * 格式化格式,返回新的对象避免线程安全问题;
     */
    public static SimpleDateFormat format(){
        return new SimpleDateFormat(FORMAT_STR);
    }

    /**
     * 格式化格式,返回新的对象避免线程安全问题;
     */
    public static SimpleDateFormat formatDetail(){
        return new SimpleDateFormat(FORMAT_STR_DETAIL);
    }

    /**
     * 计算统计时间段
     * @param dateType 时间统计范围
     * @param cold 时间基准
     */
    public static String[] strAndEnd(String dateType,Calendar cold) {
        String[] rsu = new String[2];

        String str = "{date} 00:00:00"; //str
        String end = "{date} 23:59:59"; //end

        Calendar cld = Calendar.getInstance(Locale.CHINA); //使用副本, 不要污染原基准;并且线程安全
        cld.setTime(cold.getTime());

        if (DateType.WEEK.v().equals(dateType)) {

            cld.setFirstDayOfWeek(Calendar.MONDAY);//以周一为首日
            cld.setTimeInMillis(System.currentTimeMillis());//当前时间

            cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//周一
            str = str.replace("{date}", Dates.format().format(cld.getTime()));

            cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//周日
            end = end.replace("{date}", Dates.format().format(cld.getTime()));

        } else if (DateType.MONTH.v().equals(dateType)) {

            cld.set(Calendar.DAY_OF_MONTH, 1);
            str = str.replace("{date}", Dates.format().format(cld.getTime()));

            cld.set(Calendar.DATE, cld.getActualMaximum(Calendar.DATE));
            end = end.replace("{date}", Dates.format().format(cld.getTime()));

        } else if (DateType.THREE_MONTH.v().equals(dateType)) {

            cld.add(Calendar.MONTH, -2);
            cld.set(Calendar.DAY_OF_MONTH, 1);
            str = str.replace("{date}", Dates.format().format(cld.getTime()));

            cld.add(Calendar.MONTH, 2);
            cld.set(Calendar.DATE, cld.getActualMaximum(Calendar.DATE));
            end = end.replace("{date}", Dates.format().format(cld.getTime()));

        } else if (DateType.ALL.v().equals(dateType)) {
            str = null;
            end = null;
        } else {
            str = null;
            end = null;
        }
        if (null == str && null == end) {
            return null;
        }
        rsu[0] = str;
        rsu[1] = end;
        return rsu;
    }

    //趋势图的 日期进行初始化
    public static LinkedList<Serializable> initTrend(String dateType, Calendar cold) throws AlertException {

        LinkedList<Serializable> list  = new LinkedList<>();

        Calendar cld = Calendar.getInstance(Locale.CHINA); //使用副本, 不要污染原基准;并且线程安全
        cld.setTime(cold.getTime());

        if (DateType.WEEK.v().equals(dateType)) {  //周趋势图

            cld.setFirstDayOfWeek(Calendar.MONDAY);//以周一为首日

            cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//周一

            for (int i = 1; i <= 7; i++) {

                list.add(Dates.format().format(cld.getTime()));
                cld.add(Calendar.DAY_OF_WEEK,1); //增加一天

            }
        } else if (DateType.MONTH.v().equals(dateType)) { //月趋势图

            int actualMaximum = cld.getActualMaximum(Calendar.DATE);//获取当月最大天数;

            cld.set(Calendar.DAY_OF_MONTH, 1); //以当月第1号为首日

            for(int i=1; i<=actualMaximum; i++ ){

                list.add(Dates.format().format(cld.getTime()));
                cld.add(Calendar.DAY_OF_MONTH,1); //增加一天

            }

        }else if(DateType.THREE_MONTH.v().equals(dateType)){ //三月 趋势图

            int actualMaximum = cld.getActualMaximum(Calendar.DATE);//获取当月最大天数;

            cld.add(Calendar.MONTH,-1);
            int uol = cld.getActualMaximum(Calendar.DATE);// 获取上个月最大天数

            cld.add(Calendar.MONTH,-1);
            int upz = cld.getActualMaximum(Calendar.DATE);// 获取上上个月最大天数

            cld.set(Calendar.DAY_OF_MONTH, 1); //以当月第1号为首日

            int azz = actualMaximum + uol + upz;

            for(int i=1; i<=azz; i++ ){

                list.add(Dates.format().format(cld.getTime()));
                cld.add(Calendar.DAY_OF_MONTH,1); //增加一天

            }

        }else if(DateType.ALL.v().equals(dateType)){  //全部

            //全部,暂时以 2020-04-01 到 当前时间为的本月月底
            Date parse;
            try {
                parse = Dates.format().parse("2020-04-01");
            }catch (Exception e){
                throw new AlertException("转换失败: 2020-04-09");
            }

            Calendar strZ = Calendar.getInstance(Locale.CHINA);
            strZ.setTime(parse);

            Calendar nowZ = Calendar.getInstance(Locale.CHINA);
            nowZ.set(Calendar.DAY_OF_MONTH, 1);
            nowZ.set(Calendar.DATE, nowZ.getActualMaximum(Calendar.DATE));

            int days = (int) ((nowZ.getTime().getTime() - strZ.getTime().getTime()) / (1000*3600*24)) + 1;

            for(int i=1; i<=days; i++ ){

                list.add(Dates.format().format(strZ.getTime()));
                strZ.add(Calendar.DAY_OF_MONTH,1); //增加一天

            }
        }

        return list;
    }

    private Dates () {}
}
